# -*- coding: utf-8 -*-
"""
-------------------------------------------------
Project Name: luffcity study project
File Name: client.py
Author: kij
Create Date: 2021/2/28
-------------------------------------------------
"""
import os
import json
import socket
import struct


# 用户端发送


def get_type_data(conn, input_message):
	"""得到输入数据进行分析，看是否是可以传输类型并对相应类型进行上传"""
	data_list = str(input_message).split('|')
	if len(data_list) != 2:
		print('输入格式错误')
		return
	if data_list[0] == 'msg':
		print("文本类型")
		send_msg(conn, data_list[1])
	elif data_list[0] == 'file':
		print("文件类型")
		send_file(conn, data_list[1])
	else:
		print("未知类型")


def send_msg(conn, data):
	"""上传文本类型数据"""
	print(data)
	# conn.sendall()
	updata_dict = {
		'type': 'msg',
		'msg': data
	}
	request = json.dumps(updata_dict)
	print(request)


def send_file(conn, data):
	"""上传文件类型数据"""
	# os.sep 不容系统的路径分隔符 -1取最后一个坐标的内容 也就是文件名
	file_name = data.rsplit(os.sep, maxsplit=1)[-1]  # / 分割  \
	# 通过方法获取文件大小
	file_size = os.stat(data).st_size
	updata_dict = {
		'type': 'file',
		'file_name': file_name,
		'file_path': data,
		'file_size': file_size,
	}
	request = json.dumps(updata_dict)
	json_size = len(request.encode('utf-8'))
	print(request)
	print(json_size)
	# 先传递json数据长度的四个字节 加上文件的字节 总长度
	conn.send(struct.pack('i', json_size))
	# 再发送json数据
	conn.sendall(request.encode('utf-8'))

	conn.send(struct.pack('i', file_size))

	with open(data, mode='rb') as file:
		# 空字节用于装数据
		all_ready_read_size = 0
		while all_ready_read_size < file_size:
			read_size = 1024 if file_size - all_ready_read_size > 1024 else file_size - all_ready_read_size
			read_bytes = file.read(read_size)
			# 发送读取的文件字节
			conn.sendall(read_bytes)
			all_ready_read_size += len(read_bytes)


def run():
	print("""
		上传文件还是文本
		msg|文本内容
		file|文件路径
		""")
	# 新建socket对象
	client = socket.socket()
	# 链接服务器端口和ip 元组类型端口为整型
	client.connect(('192.168.1.27', 9997))
	input_message = input("输入数据>>>")
	get_type_data(client, input_message=input_message)


if __name__ == "__main__":
	run()
